//给定两个字符串 s 和 p，找到 s 中所有 p 的 变位词 的子串，返回这些子串的起始索引。不考虑答案输出的顺序。 
//
// 变位词 指字母相同，但排列不同的字符串。 
//
// 
//
// 示例 1： 
//
// 
//输入: s = "cbaebabacd", p = "abc"
//输出: [0,6]
//解释:
//起始索引等于 0 的子串是 "cba", 它是 "abc" 的变位词。
//起始索引等于 6 的子串是 "bac", 它是 "abc" 的变位词。
// 
//
// 示例 2： 
//
// 
//输入: s = "abab", p = "ab"
//输出: [0,1,2]
//解释:
//起始索引等于 0 的子串是 "ab", 它是 "ab" 的变位词。
//起始索引等于 1 的子串是 "ba", 它是 "ab" 的变位词。
//起始索引等于 2 的子串是 "ab", 它是 "ab" 的变位词。
// 
//
// 
//
// 提示： 
//
// 
// 1 <= s.length, p.length <= 3 * 10⁴ 
// s 和 p 仅包含小写字母 
// 
//
// 
//
// 注意：本题与主站 438 题相同： https://leetcode-cn.com/problems/find-all-anagrams-in-a-
//string/ 
//
// Related Topics 哈希表 字符串 滑动窗口 👍 64 👎 0


package LeetCode.editor.cn;


import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author ldltd
 * @date 2025-01-16 13:54:32
 * @description LCR 015.找到字符串中所有字母异位词
 
 */
 
public class VabMRr {
    public static void main(String[] args) {
    //测试代码
    VabMRr fun = new VabMRr();
    Solution solution= fun.new Solution();
    
    }

//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public List<Integer> findAnagrams1(String s, String p) {
        List<Integer> res=new ArrayList<>();
        int [] par=new int[26];
        int [] sar=new int[26];
        if(p.length()>s.length()) return  new ArrayList<>();
        for (int i = 0; i < p.length(); i++) {
            par[p.charAt(i)-'a']++;
            sar[s.charAt(i)-'a']++;
        }
        if(Arrays.equals(sar,par)) res.add(0);
        for (int i =0; i < s.length()-p.length() ;i++) {
            sar[s.charAt(i)-'a']--;
            sar[s.charAt(i+p.length())-'a']++;
            if(Arrays.equals(sar,par)) res.add(i+1);

        }
        return res;
    }
    public List<Integer> findAnagrams(String s, String p) {
        int [] c=new int[128];
        for (char ch : p.toCharArray()) {
            c[ch]++;
        }
        int l=0,r=0;
        List<Integer> res=new ArrayList<>();
        while (r<s.length()){
            if(c[s.charAt(r)]>0){
                c[s.charAt(r++)]--;
                if(r-l==p.length()) res.add(l);
            }else {
                c[s.charAt(l++)]++;
            }
        }
        return res;
    }

}
//leetcode submit region end(Prohibit modification and deletion)

}
